package learn.up.generic;

public class GenericTest {

	public static void main(String[] args) {
   //测试泛型类
		
		//当使用了泛型，编译的时候，这里就限制了打印的类型，只能是声明的时候确定的类型
		GenericClass<String> gc = new GenericClass<String>();
//		gc.setT(123);//编译不通过
		gc.setT("jjj");//ok
		gc.print("avf");
		fun(gc);
		//printClass<? extends Number> 限制了泛型的范围
//		printClass(gc);//编译不通过，not applicable for the arguments
		GenericClass<Integer> gci=new GenericClass<Integer>();
		gci.setT(1235);
		fun(gci);
		printClass(gci);
		
		//2.测试泛型方法
		GenericMethod gm = new GenericMethod();
		gm.print("qwe3r");
		gm.print(123);
		
		gm.get(123);
		GenericMethod.printStatic(111);
		
		/*
		 * 当方法上有和类上同名泛型的时候，方法内部的泛型类型是方法上声明的泛型类型，
		 */
		gc.show("123");
		gc.print("abc");
//		gc.print(123);//编译不通过
		gc.show(123);//编译通过
	}
	//参数是定义了泛型的类，使用通配符?，可以接受任意泛型类型的参数
	//若设置了确定泛型类型参数，则编译的时候会检查类型是否符合 fun(GeneriClass<String> s)  
	public static void fun(GenericClass<?> gn){
		System.out.println(gn);
	}
	public static void printClass(GenericClass<? extends Number> gc){
		System.out.println("只能是继承域Number的类"+gc);
	}
	public static void printClass2(GenericClass<? super String> gc){
		System.out.println("泛型下限，只能接受String类型或其父类型，这里是Object"+gc);
	}
}
